Django Models和Admin以及Views和URL

Django Shell

现在我们进入Django中的交互式shell来进行数据库的增删改查等操作

1
2
3
4
5
6
$ python manage.py shell
Python 3.4.2 (v3.4.2:ab2c023a9432, Oct 5 2014, 20:42:22)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

这里进入Django的shell和python内置的shell是非常类似的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
>>> from article.models import Article
>>> #create数据库增加操作
>>> Article.objects.create(title = 'Hello World', category = 'Python', content = 'Let us add a database item')
<Article: Article object>
>>> Article.objects.create(title = 'Django Blog Study', category = 'Python', content = 'Django Blog Tutorial')
<Article: Article object>

>>> #all和get的数据库查看操作
>>> Article.objects.all() #查看全部对象, 返回一个列表, 无对象返回空list
[<Article: Article object>, <Article: Article object>]
>>> Article.objects.get(id = 1) #返回符合条件的对象
<Article: Article object>

>>> #update数据库修改操作
>>> first = Article.objects.get(id = 1) #获取id = 1的对象
>>> first.title
'Hello World'
>>> first.date_time
datetime.datetime(2014, 12, 26, 13, 56, 48, 727425, tzinfo=<UTC>)
>>> first.content
'Let us add a database item'
>>> first.category
'Python'
>>> first.content = 'Hello World, How are you'
>>> first.content #再次查看是否修改成功, 修改操作就是点语法
'Hello World, How are you'

>>> #delete数据库删除操作
>>> first.delete()
>>> Article.objects.all() #此时可以看到只有一个对象了, 另一个对象已经被成功删除
[<Article: Article object>]

>>>Article.objects.filter(title='Django Blog Study') # 使用 filter() 按题目过滤
<QuerySet [<Article: Django Blog Study>]>

>>>Article.objects.filter(title='Django Blog Study', id="1") # 也可以多个条件
<QuerySet [<Article: Django Blog Study>]>
#上面是精确匹配 也可以包含性查询

>>>Article.objects.filter(title__contains='Django')
<QuerySet [<Article: Django Blog Study>]>

#数据排序
Article.objects.order_by("title")
Article.objects.order_by("-titile") # 倒序

#如果需要以多个字段为标准进行排序(第二个字段会在第一个字段的值相同的情况下被使用到),使用多个参数就可以了
Article.objects.order_by("title", "id")

#连锁查询
Article.objects.filter(title__contains='Django').order_by("-id")

#限制返回的数据数量
Article.objects.filter(title__contains='Django')[0]
Article.objects.filter(title__contains='Django')[0:3] #可以进行类似于列表的操作

使用第三方插件

Django现在已经相对成熟, 已经有许多不错的可以使用的第三方插件可以使用, 这些插件各种各样, 现在我们使用一个第三方插件使后台管理界面更加美观, 目前大部分第三方插件可以在Django Packages 中查看,

尝试使用django-admin-bootstrap美化后台管理界面

安装

1
$ sudo pip install bootstrap-admin

配置

然后在my_blog/my_blog/settings.py中修改INSTALLED_APPS

1
2
3
4
5
6
7
8
9
10
11
12
13
INSTALLED_APPS = (
'bootstrap_admin', #一定要放在`django.contrib.admin`前面
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article',
)

from django.conf import global_settings
BOOTSTRAP_ADMIN_SIDEBAR_MENU = True

保存后, 再次刷新页面, localhost:9000/admin

界面是不是美腻了许多…

简单Django Views和URL

Django中views里面的代码就是一个一个函数逻辑, 处理客户端(浏览器)发送的HTTPRequest, 然后返回HTTPResponse,

那么开始在my_blog/article/views.py中编写简单的逻辑

1
2
3
4
5
6
7
#现在你的views.py应该是这样
from django.shortcuts import render
from django.http import HttpResponse

# Create your views here.
def home(request):
return HttpResponse("Hello World, Django")

那么如何使这个逻辑在http请求进入时, 被调用呢, 这里需要在my_blog/my_blog/urls.py中进行url设置

1
2
3
4
5
6
7
8
from django.conf.urls import url
from django.contrib import admin
from article import views
urlpatterns = [

url(r'^admin/', admin.site.urls),
url(r'^$', views.home),
]

url()函数有四个参数, 两个是必须的:regex和view, 两个可选的:kwargs和name

  • regex是regular expression的简写,这是字符串中的模式匹配的一种语法, Django 将请求的URL从上至下依次匹配列表中的正则表达式,直到匹配到一个为止。

    • 更多正则表达式的使用可以查看Python正则表达式
  • view当 Django匹配了一个正则表达式就会调用指定的view逻辑, 上面代码中会调用article/views.py中的home函数

  • kwargs任意关键字参数可传一个字典至目标view

  • name命名你的 URL, 使url在 Django 的其他地方使用, 特别是在模板中

现在在浏览器中输入localhost:9000应该可以看到下面的界面

Django Views和URL更近一步

很多时候我们希望给view中的函数逻辑传入参数, 从而呈现我们想要的结果

现在我们这样做, 在my_blog/article/views.py加入如下代码:

1
2
def detail(request, my_args):
return HttpResponse("You're looking at my_args %s." % my_args)

在my_blog/my_blog/urls.py中设置对应的url,

1
2
3
4
5
6
7
8
9
from django.conf.urls import url
from django.contrib import admin
from article import views
urlpatterns = [

url(r'^admin/', admin.site.urls),
url(r'^$', views.home),
url(r'^(?P<my_args>\d+)/$', views.detail, name='detail'),
]

^(?P<my_args>\d+)/$这个正则表达式的意思是将传入的一位或者多位数字作为参数传递到views中的detail作为参数, 其中?P<my_args>定义名称用于标识匹配的内容

我们尝试如下的URL

http://localhost:9000/1000/

尝试传参访问数据库

修改在my_blog/article/views.py代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.shortcuts import render
from django.http import HttpResponse
from article.models import Article

# Create your views here.
def home(request):
return HttpResponse("Hello World, Django")

def detail(request, my_args):
post = Article.objects.all()[int(my_args)]
str = ("title = %s, category = %s, date_time = %s, content = %s"
% (post.title, post.category, post.date_time, post.content))
return HttpResponse(str)

这里最好在admin后台管理界面增加几个Article对象, 防止查询对象为空, 出现异常
现在可以访问 http://localhost:9000/1/

显示如下数据表示数据库访问正确(这些数据都是自己添加的), 并且注意Article.objects.all()返回的是一个列表